Pytorch优化器Optimizer 您所在的位置:网站首页 pytorch 可训练参数 Pytorch优化器Optimizer

Pytorch优化器Optimizer

2023-03-12 08:45| 来源: 网络整理| 查看: 265

优化器Optimizer 什么是优化器

pytorch的优化器:管理并更新模型中可学习参数的值,使得模型输出更接近真实标签

导数:函数在指定坐标轴上的变化率 方向导数:指定方向上的变化率(二元及以上函数,偏导数) 梯度:一个向量,方向是使得方向导数取得最大值的方向

Pytorch的Optimizer

在这里插入图片描述

参数

defaults:优化器超参数state:参数的缓存,如momentum的缓存param_groups:管理的参数组_step_count:记录更新次数,学习率调整中使用

基本方法:

zero_grad():清空所管理参数的梯度 在这里插入图片描述

pytorch特性:张量梯度不会自动清零

step():执行一步更新

add_param_group():添加参数组 在这里插入图片描述

state_dict():获取优化器当前状态信息字典 在这里插入图片描述

load_state_dict():加载状态信息字典

使用代码帮助理解和学习 import os import torch import torch.optim as optim BASE_DIR = os.path.dirname(os.path.abspath(__file__)) weight = torch.randn((2, 2), requires_grad=True) weight.grad = torch.ones((2, 2)) # 需要传入一个可迭代对象 optimizer = optim.SGD([weight], lr=1) print("weight before step:{}".format(weight.data)) optimizer.step() print("weight after step:{}".format(weight.data)) weight before step:tensor([[-0.0606, -0.3197], [ 1.4949, -0.8007]]) weight after step:tensor([[-1.0606, -1.3197], [ 0.4949, -1.8007]])

weight = weight - lr * weight.grad 上面学习率是1,把学习率改为0.1试一下

optimizer = optim.SGD([weight], lr=0.1) weight before step:tensor([[ 0.3901, 0.2167], [-0.3428, -0.7151]]) weight after step:tensor([[ 0.2901, 0.1167], [-0.4428, -0.8151]])

接着上面的代码,我们再看一下add_param_group方法

# add_param_group方法 print("optimizer.param_groups is \n{}".format(optimizer.param_groups)) w2 = torch.randn((3, 3), requires_grad=True) optimizer.add_param_group({"params": w2, "lr": 0.0001}) print("optimizer.param_groups is\n{}".format(optimizer.param_groups)) optimizer.param_groups is [{'params': [tensor([[ 0.1749, -0.2018], [ 0.0080, 0.3517]], requires_grad=True)], 'lr': 0.1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}] optimizer.param_groups is [{'params': [tensor([[ 0.1749, -0.2018], [ 0.0080, 0.3517]], requires_grad=True)], 'lr': 0.1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}, {'params': [tensor([[ 0.4538, -0.8521, -1.3081], [-0.0158, -0.2708, 0.0302], [-0.3751, -0.1052, -0.3030]], requires_grad=True)], 'lr': 0.0001, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}]

关于zero_grad()、step()、state_dict()、load_state_dict()这几个方法比较简单就不再赘述。

SGD随机梯度下降 learning_rate学习率

在这里插入图片描述

这里学习率为1,可以看到并没有达到梯度下降的效果,反而y值越来越大,这是因为更新的步伐太大。

在这里插入图片描述

我们以y = 4*x^2这个函数举例,将y值作为要优化的损失值,那么梯度下降的过程就是为了找到y的最小值(即此函数曲线的最小值);如果我们把学习率设置为0.2,就可以得到这样一个梯度下降的图

def func(x): return torch.pow(2*x, 2) x = torch.tensor([2.], requires_grad=True) iter_rec, loss_rec, x_rec = list(), list(), list() lr = 0.2 max_iteration = 20 for i in range(max_iteration): y = func(x) y.backward() print("iter:{}, x:{:8}, x.grad:{:8}, loss:{:10}".format( i, x.detach().numpy()[0], x.grad.detach().numpy()[0], y.item() )) x_rec.append(x.item()) x.data.sub_(lr * x.grad) x.grad.zero_() iter_rec.append(i) loss_rec.append(y.item()) plt.subplot(121).plot(iter_rec, loss_rec, '-ro') plt.xlabel("Iteration") plt.ylabel("Loss value") x_t = torch.linspace(-3, 3, 100) y = func(x_t) plt.subplot(122).plot(x_t.numpy(), y.numpy(), label="y = 4*x^2") plt.grid() y_rec = [func(torch.tensor(i)).item() for i in x_rec] plt.subplot(122).plot(x_rec, y_rec, '-ro') plt.legend() plt.show()

在这里插入图片描述

这里其实存在一个下降速度更快的学习率,那就是0.125,一步就可以将loss更新为0,这是因为我们已经了这个函数表达式,而在实际神经网络模型训练的过程中,是不知道所谓的函数表达式的,所以只能选取一个相对较小的学习率,然后以训练更多的迭代次数来达到最优的loss。

在这里插入图片描述

动量(Momentum,又叫冲量)

结合当前梯度与上一次更新信息,用于当前更新

为什么会出现动量这个概念?

当学习率比较小时,往往更新比较慢,通过引入动量,使得后续的更新受到前面更新的影响,可以更快的进行梯度下降。

指数加权平均:当前时刻的平均值(Vt)与当前参数值(θ)和前一时刻的平均值(Vt-1)的关系。

在这里插入图片描述

根据上述公式进行迭代展开,因为0'params': [weights_2]} ], lr=lr_init) lambda1 = lambda epoch: 0.1 ** (epoch // 20) lambda2 = lambda epoch: 0.95 ** epoch scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2]) lr_list, epoch_list = list(), list() for epoch in range(max_epoch): for i in range(iteration): optimizer.step() optimizer.zero_grad() scheduler.step() lr_list.append(scheduler.get_lr()) epoch_list.append(epoch) print('epoch: {:5d}, lr:{}'.format(epoch, scheduler.get_lr()))



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有